home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LTP_Spread.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  4KB  |  162 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID __regargs
  10. LTP_Spread(LayoutHandle *Handle,ObjectNode *Group,LONG Width,LONG Height)
  11. {
  12.     ObjectNode    *Node;
  13.     LONG         Count;
  14.  
  15.     Count = 0;
  16.  
  17.     SCANGROUP(Group,Node)
  18.     {
  19.         Count++;
  20.     }
  21.  
  22.     if(Group -> Special . Group . Horizontal)
  23.     {
  24.         LONG Room = Width - Group -> Width,Left,Width,i = 0;
  25.  
  26.         if(Count > 1)
  27.         {
  28.             Left = 0;
  29.  
  30.             Room += --Count * Handle -> InterWidth;
  31.         }
  32.         else
  33.             Left = Room / 2;
  34.  
  35.         SCANGROUP(Group,Node)
  36.         {
  37.             if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  38.             {
  39.                 Width = Node -> Width;
  40.  
  41.                 switch(Node -> LabelPlace)
  42.                 {
  43.                     case PLACE_LEFT:
  44.  
  45.                         if(Node -> Type == MX_KIND)
  46.                         {
  47.                             Left += Node -> Special . Radio . LabelWidth + INTERWIDTH;
  48.  
  49.                             if(Node -> Label)
  50.                             {
  51.                                 if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  52.                                     Left += Node -> LabelWidth + INTERWIDTH;
  53.                                 else
  54.                                     Width += INTERWIDTH + Node -> LabelWidth;
  55.                             }
  56.                         }
  57.                         else
  58.                             Left += Node -> LabelWidth + INTERWIDTH;
  59.  
  60.                         break;
  61.  
  62.                     case PLACE_RIGHT:
  63.  
  64.                         if(Node -> Type == MX_KIND)
  65.                         {
  66.                             Width += INTERWIDTH + Node -> Special . Radio . LabelWidth;
  67.  
  68.                             if(Node -> Label)
  69.                             {
  70.                                 if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  71.                                     Left += Node -> LabelWidth + INTERWIDTH;
  72.                                 else
  73.                                     Width += INTERWIDTH + Node -> LabelWidth;
  74.                             }
  75.                         }
  76.                         else
  77.                             Width += INTERWIDTH + Node -> LabelWidth;
  78.  
  79.                         break;
  80.                 }
  81.  
  82.                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
  83.                     Left += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
  84.  
  85.                 if(Node -> Type == SLIDER_KIND)
  86.                 {
  87.                     if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT)
  88.                         Width += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  89.  
  90.                     if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  91.                         Left += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  92.                 }
  93.  
  94. #ifdef DO_LEVEL_KIND
  95.                 if(Node -> Type == LEVEL_KIND)
  96.                 {
  97.                     if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
  98.                         Width += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  99.  
  100.                     if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  101.                         Left += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  102.                 }
  103. #endif    /* DO_LEVEL_KIND*/
  104.  
  105.                 Node -> Left = Left;
  106.  
  107.                 Left += Width + ((Room * (i + 1)) / Count - (Room * i) / Count);
  108.  
  109.                 i++;
  110.             }
  111.         }
  112.     }
  113.     else
  114.     {
  115.         LONG Room = Height - Group -> Height,Height,Top,y,i = 0;
  116.  
  117.         if(Count > 1)
  118.         {
  119.             Top = 0;
  120.  
  121.             Room += --Count * Handle -> InterHeight;
  122.         }
  123.         else
  124.             Top = Room / 2;
  125.  
  126.         SCANGROUP(Group,Node)
  127.         {
  128.             if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  129.             {
  130.                 if(Count++)
  131.                 {
  132.                     if(Node -> ExtraSpace > 0)
  133.                         y = Top + Node -> ExtraSpace * Handle -> InterHeight;
  134.                     else
  135.                     {
  136.                         if(Node -> ExtraSpace < 0)
  137.                             y = Top - Node -> ExtraSpace;
  138.                         else
  139.                             y = Top + Handle -> InterHeight;
  140.                     }
  141.                 }
  142.                 else
  143.                     y = Top;
  144.  
  145.                 if(Node -> LabelPlace == PLACE_ABOVE)
  146.                     y += Handle -> RPort . TxHeight + INTERHEIGHT;
  147.  
  148.                 Node -> Top = y;
  149.  
  150.                 if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
  151.                     Height = Node -> Height + INTERHEIGHT + Handle -> RPort . TxHeight;
  152.                 else
  153.                     Height = Node -> Height;
  154.  
  155.                 Top = y + Height + ((Room * (i + 1)) / Count - (Room * i) / Count);
  156.  
  157.                 i++;
  158.             }
  159.         }
  160.     }
  161. }
  162.